package com.ljf.jdvideo.jd;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.swing.JTextArea;

import org.openqa.selenium.By;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.ljf.jdvideo.Main;

public class DownVideo implements Runnable {
    private WebDriver driver;
    private String url;
    private JTextArea mesg;
    
    public DownVideo(String url, JTextArea mesg) {
        super();
        this.url = url;
        this.mesg = mesg;
        Capabilities capabilities = DesiredCapabilities.chrome();
        driver = new RemoteWebDriver(Main.service.getUrl(),capabilities);    
    }

    public void run()  {
        mesg.setText("开始下载..................\r\n");
        String downPath;
        try {
            driver.get(url);
            WebElement videoPlayButton = driver.findElement(By.cssSelector(".video-icon.J-video-icon"));
            videoPlayButton.click();
            new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver input) {
                    WebElement playerElement = input.findElement(By.className("J-v-player"));
                    return !"".equals(playerElement.getText().trim());
                }
            });
            WebElement playerElement = driver.findElement(By.className("J-v-player"));
            System.out.println("playerElement:"+playerElement.getText());
            WebElement div = playerElement.findElement(By.tagName("div"));
            System.out.println("1div:"+div.getText());
            System.out.println("2div:"+div.isEnabled());
            WebElement video = div.findElement(By.tagName("video"));
            System.out.println("1video:"+video.getText());
            System.out.println("2video:"+video.isEnabled());
            WebElement videoSource = video.findElement(By.tagName("source"));
            System.out.println("1videoSource:"+videoSource.getText());
            System.out.println("2videoSource:"+videoSource.isEnabled());
            String videoUrl = videoSource.getAttribute("src");
            System.out.println("videoUrl:"+videoUrl);
            String title = driver.getTitle();
            
            
            downPath = Main.savePath+"\\"+title+".mp4";
            httpDownload(videoUrl, downPath);
            mesg.append("下载完成。文件地址:"+downPath+"\r\n");
        } catch (Exception e) {
            e.printStackTrace();
            mesg.append("下载错误。错误信息:\r\n"+e.getMessage()+"\r\n");
        } finally {
            try {
                driver.quit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public static boolean httpDownload(String httpUrl, String saveFile) {
        if(new File(saveFile).isFile() && !new File(saveFile).getParentFile().exists()) {
            new File(saveFile).getParentFile().mkdirs();
        }
        // 1.下载网络文件
        int byteRead;
        URL url;
        try {
            url = new URL(httpUrl);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
            return false;
        }
 
        try {
            //2.获取链接
            URLConnection conn = url.openConnection();
            //3.输入流
            InputStream inStream = conn.getInputStream();
            //3.写入文件
            FileOutputStream fs = new FileOutputStream(saveFile);
 
            byte[] buffer = new byte[1024];
            while ((byteRead = inStream.read(buffer)) != -1) {
                fs.write(buffer, 0, byteRead);
            }
            inStream.close();
            fs.close();
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public static boolean download(String urlString, String filename,int timeout){
        boolean ret = false;
        File file = new File(filename);
        try {
            if(file.exists()){
                ret = true;
            }else{
                // 构造URL
                URL url = new URL(urlString);
                // 打开连接
                HttpURLConnection con = (HttpURLConnection )url.openConnection();
                con.setConnectTimeout(timeout);
                con.setReadTimeout(timeout);
                con.connect();
                int contentLength = con.getContentLength();
                // 输入流
                InputStream is = con.getInputStream();
                // 1K的数据缓冲
                byte[] bs = new byte[1024];
                // 读取到的数据长度
                int len;
                // 输出的文件流

                File file2=new File(file.getParent());
                file2.mkdirs();
                if(file.isDirectory()){

                }else{
                    file.createNewFile();//创建文件
                }
                OutputStream os = new FileOutputStream(file);
                // 开始读取
                while ((len = is.read(bs)) != -1) {
                    os.write(bs, 0, len);
                }
                // 完毕，关闭所有链接
                os.close();
                is.close();
                if(contentLength != file.length()){
                    file.delete();
                    ret = false;
                }else{
                    ret = true;
                }
            }
        } catch (IOException e) {
            file.delete();
            ret = false;
//            LOGGER.error("[VideoUtil:download]:\n" + " VIDEO URL：" + urlString + " \n NEW FILENAME:" + filename + " DOWNLOAD FAILED!! ");
        }finally {
            return ret;
        }
    }

}
